import uuid
import logging
from datetime import datetime, timedelta
from google.appengine.ext import webapp, db
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api.labs import taskqueue
import bts
from demo import models
import indexes

logging.getLogger().setLevel(logging.INFO)

sample_title="This is a sample title with some stopwords and some other text"

sample_body="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum gravida laoreet mi at ultrices.
"""
#Nunc sit amet urna nec sapien vestibulum vehicula in a tortor. Nullam eu magna ut justo porttitor pretium. Maecenas scelerisque egestas auctor. Nulla ultrices quam eget turpis porta ut malesuada odio posuere. Aliquam vel bibendum purus. Suspendisse gravida porttitor purus, nec lacinia tortor facilisis eu. Ut posuere massa id mi volutpat tincidunt. Pellentesque vel mi in lorem consequat scelerisque. Sed quis aliquam massa. Morbi neque enim, feugiat id ultrices quis, bibendum condimentum risus. Suspendisse tempus feugiat venenatis.
#
#Suspendisse porta, nisl a convallis congue, eros mi iaculis sem, in laoreet est nunc eu nunc. Nunc congue, ipsum id varius consequat, diam risus varius sapien, eu auctor urna tortor at magna. Aenean ut neque at sapien sodales semper nec eu risus. Sed sodales vestibulum lacus, cursus imperdiet purus eleifend quis. Vestibulum metus urna, scelerisque sit amet ornare nec, fringilla ut purus. Aliquam ut dapibus urna. Quisque in justo odio, vel tempus nisl. Praesent eu imperdiet risus. Cras non laoreet risus. Morbi metus magna, convallis non cursus ultricies, eleifend sed massa. Fusce at ultricies massa. Morbi at feugiat lectus.
#
#Pellentesque placerat eros metus. Suspendisse nec tortor justo. Nulla facilisi. In imperdiet condimentum neque dapibus porttitor. Nulla facilisi. Nullam mattis enim ac mauris scelerisque id venenatis augue condimentum. Quisque lacinia massa eu risus varius rhoncus sit amet in dolor. Nunc at nibh id eros vulputate varius. Sed id ante id mauris mattis tempor. Proin sodales sapien vitae mauris dictum rhoncus. Aliquam vel gravida nisi. Nam vehicula fermentum velit ac fringilla. Morbi pellentesque convallis viverra. Fusce augue justo, eleifend at tincidunt vel, ultrices quis orci. Donec scelerisque mattis suscipit.
#
#Ut neque ligula, malesuada ut faucibus id, viverra ut dui. Curabitur vehicula accumsan risus. Nunc sem leo, accumsan quis luctus at, tristique eget nulla. Proin convallis augue ut orci luctus ullamcorper. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas congue, augue in accumsan placerat, nibh odio ultrices magna, sit amet consectetur eros odio quis enim. Morbi sed consequat orci. Vestibulum congue mattis odio, vitae tristique arcu tincidunt eget. Vestibulum congue mollis ultrices. Nulla tempor ligula eu orci viverra fringilla. Donec ut augue at leo pellentesque laoreet vitae sit amet dolor. Suspendisse lacinia placerat venenatis. Praesent non elit diam. Nulla volutpat, ipsum sit amet adipiscing venenatis, tellus sapien elementum libero, non fringilla purus augue at erat. Ut a nulla elit, et congue nulla. Suspendisse et neque felis, vel scelerisque turpis. Nam vel eros nisi. Donec at quam at neque dapibus lacinia. Nam sit amet arcu sem.
#
#Vivamus sit amet est arcu, sed ultrices purus. Nulla vitae turpis in lacus ultrices imperdiet. Integer congue, mauris pulvinar venenatis tempor, mi orci convallis justo, id condimentum leo elit a urna. Integer tortor sem, adipiscing a fringilla et, mollis quis ante. Vivamus ac libero lorem, id dapibus libero. Maecenas sed ultrices nisi. Maecenas ut nulla erat. Suspendisse eros orci, bibendum ut cursus vitae, dignissim in leo. Aliquam tincidunt metus sed neque eleifend viverra. Cras eget magna ac nisl convallis pretium. Nam aliquet accumsan elit a vestibulum. Vivamus auctor nibh in turpis egestas quis vestibulum nunc sollicitudin. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
#
#Suspendisse potenti. Phasellus ac odio vel nulla ullamcorper placerat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin gravida volutpat felis id blandit. Vestibulum euismod vestibulum ultrices. Phasellus ultricies dictum euismod. Proin magna erat, molestie at ultricies non, convallis eu dui. Maecenas vitae quam mi, a malesuada nunc. Phasellus et purus ac dui fermentum feugiat et quis quam. Vivamus ipsum quam, dignissim a fringilla et, varius a dui. Sed blandit diam et sem bibendum vestibulum. Sed scelerisque nibh vel est malesuada gravida. Nulla non ligula eros, eget suscipit tortor. Vestibulum quis mi nibh. Donec ac elit id elit semper viverra sed non enim. Donec tortor ante, vestibulum id convallis vel, ornare in felis. In eu nibh eget dolor tincidunt fermentum.
#
#In consequat ornare tincidunt. Nullam eget eros ut sem tincidunt suscipit ac in neque. Proin porttitor orci sed arcu congue congue. Nulla tincidunt, lorem ut porta dictum, turpis lorem ullamcorper libero, a semper purus orci id ante. Nam volutpat libero et lectus tempus adipiscing. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque condimentum tellus ac lorem bibendum ac tempus felis ultricies. Mauris hendrerit, purus vitae interdum tincidunt, justo ipsum vestibulum felis, sit amet convallis velit libero vitae enim. Suspendisse non pretium urna. In mi ipsum, tristique et posuere vitae, viverra sed neque. Aliquam nec metus nec libero adipiscing laoreet. In quis augue libero, in interdum neque. Ut sodales, tellus sit amet posuere tempor, justo quam semper ipsum, quis faucibus leo nisl a metus.
#
#Curabitur luctus tortor at dui pretium vestibulum. Duis nec lorem eget dolor mattis placerat in ut libero. Proin eget cursus elit. Mauris id gravida elit. In quis justo ligula. Curabitur dignissim, purus vitae egestas ullamcorper, felis nulla adipiscing ligula, sit amet interdum sem augue a purus. Cras ac justo auctor est dapibus iaculis. Nullam volutpat dolor at turpis convallis lacinia sollicitudin urna blandit. In luctus fermentum nibh, eu mattis lorem lacinia sed. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean feugiat euismod neque ac sollicitudin.
#
#Nunc suscipit enim in ante lobortis varius eget pellentesque ligula. In ac hendrerit nibh. Suspendisse neque sem, lacinia sagittis sollicitudin vitae, tincidunt a leo. Fusce faucibus lorem sit amet risus adipiscing ultrices. Morbi a arcu quis neque facilisis malesuada in quis nunc. Nullam bibendum, risus porta tristique bibendum, justo justo pretium odio, ut venenatis diam ligula quis magna. Morbi a odio quam. Proin mattis, velit convallis elementum tincidunt, justo nunc dapibus leo, a laoreet nisl odio sit amet mi. Praesent ultrices accumsan vulputate. Nulla facilisi.
#
#Nulla nunc nisi, convallis pretium condimentum sit amet, tempor a neque. Maecenas accumsan varius orci fermentum sollicitudin. Quisque dui turpis, vehicula eget sagittis quis, consequat id ante. Curabitur vehicula mi eu quam pulvinar varius. Duis vel congue est. Nam id ante id ante congue sodales quis sagittis est. Vestibulum faucibus sodales felis, ac bibendum nunc pretium tristique. Maecenas feugiat vehicula dui a dapibus. Nam sed aliquet neque. Suspendisse sollicitudin massa at dui bibendum eu commodo mauris gravida. Nulla facilisi.
#
#Quisque justo nulla, placerat sed fringilla vel, aliquet at quam. Praesent nisl leo, rutrum non mattis vitae, porttitor nec justo. Nullam nec velit velit. Maecenas ut nibh magna, vel dictum mauris. Curabitur mollis euismod interdum. Proin fringilla molestie facilisis. Etiam dignissim feugiat ligula, in tempor magna gravida et. Nunc venenatis rhoncus massa, a dapibus augue placerat at. Donec fermentum tellus non libero rutrum blandit. Proin dignissim condimentum tempor. Ut eget iaculis quam. Fusce sit amet ipsum eget est posuere tristique. Nullam quis lacus sit amet tellus pretium elementum et vitae ligula. In metus metus, ultrices quis vehicula sit amet, condimentum sed sapien. Phasellus vel commodo ipsum. Nullam tortor orci, laoreet non condimentum ac, commodo vitae lorem. Phasellus ultricies condimentum tempor. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
#
#Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sem ante, euismod non ultrices pellentesque, porttitor sit amet elit. Nulla pharetra velit quis velit ultrices ultrices vitae vel ligula. Fusce id urna vitae mi semper egestas eget et erat. Suspendisse potenti. Nullam sit amet orci id purus rutrum vestibulum. Nunc purus ipsum, fringilla eget tincidunt eu, faucibus non lorem. Nulla viverra eros vitae nisl pharetra nec varius enim viverra. Pellentesque pellentesque dolor nec urna laoreet eget euismod sem blandit. Proin varius magna ut felis fringilla a lacinia odio posuere. Integer cursus elit enim, nec ornare velit. Phasellus tincidunt imperdiet lacinia. Nam id dolor porttitor risus iaculis dapibus vel at dui. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean in lorem eget tellus viverra iaculis vel et tortor. Donec interdum, mi sit amet interdum mollis, dolor libero elementum diam, et accumsan nunc mi eget risus.
#
#Etiam arcu felis, posuere vitae tempus eget, hendrerit eget lectus. Aliquam consectetur neque et ligula porttitor porta. Vivamus egestas nisl sit amet lectus ultricies blandit. Nulla facilisi. Maecenas venenatis porta urna sit amet placerat. Nunc eu eros ut erat tempus tristique. Morbi nec ipsum non tortor hendrerit feugiat eu quis nisl. Aenean feugiat, magna sit amet tempus lobortis, erat nisi pharetra leo, sit amet condimentum neque odio vitae turpis. Maecenas accumsan faucibus ante eu ullamcorper. Nulla euismod dui eget erat lobortis vel feugiat erat consectetur. Maecenas dui mi, porttitor eget convallis non, rutrum quis arcu. Etiam ipsum quam, sagittis sed fringilla at, congue quis erat. Nulla facilisi. Suspendisse ultrices, tortor et tempor commodo, justo enim fringilla arcu, auctor sagittis mauris diam eget tellus.
#
#Ut convallis diam vitae ipsum accumsan at consectetur massa pharetra. Aliquam rutrum magna eget nulla bibendum at porttitor dolor suscipit. Mauris rhoncus egestas est at ornare. Nam enim metus, egestas ac ultricies vitae, interdum quis mauris. Nunc quis libero eros, et consectetur metus. Fusce tempor luctus quam, vel egestas augue blandit eu. Duis sed nulla diam, ut porttitor metus. Cras sagittis ipsum id erat pellentesque ut varius justo blandit. Suspendisse eu libero tortor, eu ultricies nisl. Nullam quam velit, convallis eu imperdiet at, sodales vel lacus. Sed tincidunt aliquet risus, eu cursus augue imperdiet in. Nam eu tellus nunc.
#
#Phasellus luctus mollis dignissim. Curabitur eget felis vel turpis mattis laoreet non eu urna. Donec tristique ultricies rutrum. Proin bibendum lectus eget lectus iaculis imperdiet. Vestibulum fringilla tellus eu enim tincidunt vitae imperdiet lorem mattis. Praesent urna sem, vestibulum eget vehicula eu, commodo et est. Maecenas eget tortor eget metus tincidunt feugiat eu vitae felis. In hac habitasse platea dictumst. Phasellus ultricies ligula sit amet nunc ornare sed scelerisque enim consequat. Curabitur pulvinar mi non odio tincidunt elementum. Integer sapien arcu, cursus sit amet tempus vitae, vestibulum quis enim. Phasellus adipiscing felis ac tortor pellentesque dictum. Nulla tristique ante ultricies velit dictum feugiat. Morbi erat felis, adipiscing et euismod et, gravida et diam. Nulla feugiat lobortis ante, et aliquet purus dapibus tristique. Fusce tempor tincidunt lectus eget tincidunt. Sed convallis aliquet neque. Nulla facilisi.
#
#Vivamus in nisi turpis, ac facilisis metus. Donec odio sapien, faucibus at interdum adipiscing, dapibus vel diam. Donec ac massa et tellus interdum convallis. Nunc dictum diam eu ipsum consectetur porta consequat lacus sodales. Ut vel ligula in velit placerat euismod ut quis metus. Aliquam id egestas orci. Vivamus fermentum scelerisque ipsum, et mollis odio auctor sed. Duis eget neque ligula, eu ornare ante. Aenean iaculis ipsum vel lorem interdum nec semper dolor iaculis. Suspendisse eros sem, sollicitudin vel volutpat scelerisque, luctus ut tortor. Duis erat justo, varius in vestibulum ac, aliquet id urna. Ut et felis eu risus interdum congue. Nunc adipiscing magna ac massa scelerisque quis luctus nunc molestie. Nunc pretium viverra semper. Aliquam porttitor urna eget eros condimentum venenatis. Cras vehicula, enim quis tristique vestibulum, odio lorem venenatis magna, id lacinia nulla lectus non felis.
#
#Nullam malesuada placerat convallis. Phasellus molestie, mauris vel tempor porta, justo orci scelerisque dolor, in aliquet quam est ac enim. Fusce et rhoncus nulla. Ut tincidunt tristique posuere. Donec purus ipsum, suscipit a convallis nec, suscipit eu metus. Pellentesque at lorem massa. Morbi nec libero elit. In hac habitasse platea dictumst. Duis aliquet porttitor nisi, fringilla gravida diam volutpat eget. Nam hendrerit mauris imperdiet tellus consectetur nec ultricies diam lobortis. Proin lacinia, augue a fringilla placerat, ligula leo condimentum sem, sed scelerisque leo ipsum ut nisi. Nam pharetra ipsum quis mi elementum a mollis elit congue. Phasellus vel odio orci, ut porta nisi. Sed eget mauris felis. Duis pellentesque, enim vitae accumsan condimentum, enim risus dictum elit, posuere auctor felis est a quam.
#
#Vivamus a justo malesuada velit egestas adipiscing ornare vitae nisl. Fusce faucibus, mi in congue fermentum, felis ante varius nisi, a imperdiet arcu libero id turpis. Integer vitae odio enim. Proin dui odio, lacinia eget porta vitae, adipiscing nec tellus. Etiam vitae tortor vitae odio commodo convallis a hendrerit risus. Morbi vulputate aliquet tellus, et consectetur ligula suscipit sed. Sed justo urna, condimentum.
#"""

def delete_all(start_time, type):
    keys = None
    count = 0
    while (datetime.now() - start_time < timedelta(seconds=20
            )) and (keys == None or len(keys) > 0):
        keys = type.all(keys_only=True).fetch(100)
        db.delete(keys)
        count += len(keys)
    return count

class LoadTestData(webapp.RequestHandler):
    def get(self):
        for name in ['An Important Topic', 'A Less Important Topic',
                     'A Minor Topic']:
            topic = models.Topic.all().filter('name =', name).get()
            if not topic:
                topic = models.Topic(name=name)
                topic.put()
        number_of_users = int(self.request.get('number_of_users'))
        number_of_posts = int(self.request.get('number_of_posts'))
        for i in range(0, number_of_users):
            username = unicode(uuid.uuid1())
            for j in range(0, number_of_posts / 50):
                taskqueue.Task(url='/demo/load-user',
                               params=dict(username=username, number_of_posts=50
                                       )).add(
                        queue_name='demo-load')
            taskqueue.Task(url='/demo/load-user',params=dict(username=username,
                                                             number_of_posts=number_of_posts % 50
                    )).add(
                    queue_name='demo-load')
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write(
                'Test data is being loaded, please check the demo-load queue to see progress'
                )

class LoadUser(webapp.RequestHandler):
    def post(self):
        topics = []
        for name in ['An Important Topic', 'A Less Important Topic',
                     'A Minor Topic']:
            topics += models.Topic.all().filter('name =', name).run()
        number_of_topics = len(topics)
        number_of_posts = int(self.request.get('number_of_posts'))
        user = models.User(name=self.request.get('username'))
        user.put()
        posts = []
        for i in range(0, number_of_posts):
            posts.append(
                    models.BlogPost(topic=topics[i % number_of_topics],
                                    posted_by=user, title=sample_title,
                                    body=sample_body))
        db.put(posts)
        for post in posts:
        # If using django, you can use the update signal to do this automatically
            bts.request_indexing(post)
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Created %s sample posts' % number_of_posts)

class Search(webapp.RequestHandler):
    def post(self):
        self.response.headers['Content-Type'] = 'text/plain'
        query_string = self.request.get('query_string')
        topic = None
        topic_name = self.request.get('topic')
        if topic_name:
            topic = models.Topic.all().filter('name =', topic_name).get()
        if topic:
            index = indexes.posts_by_topic
        else:
            index = indexes.posts
        start_time = datetime.now()
        query = index.query(query_string).order("-date_posted")
        if topic:
            query.filter("topic =", topic)
        results = query.fetch(int(self.request.get('limit')), 0)
        query_time = datetime.now()
        time_for_query = query_time - start_time
        available_results = results[0]
        number_of_results = len(results[1])
        number_of_blog_posts = models.BlogPost.all().count()
        self.response.out.write(
                'Searched %s blog posts and returned %s of %s available results in %s' % (number_of_blog_posts, number_of_results, available_results, time_for_query)
                )

class Drop(webapp.RequestHandler):
    def get(self):
        start_time = datetime.now()
        delete_all(start_time, bts.IndexEntry)
        delete_all(start_time, bts.ModelTerms)
        delete_all(start_time, models.BlogPost)
        delete_all(start_time, models.Topic)
        delete_all(start_time, models.User)
        self.response.out.write("Dropped all data")

application = webapp.WSGIApplication([('/demo/load-test-data', LoadTestData),
                                      ('/demo/load-user', LoadUser),
                                      ('/demo/search', Search),
                                      ('/demo/drop', Drop)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()